Hadoop IO
hadoop提供了多种的解压缩方式,但是由于license的问题,得单独下载。
hadoop同时也对文件读写有校验,一旦出现文件错误,就会报告给namenode,namenode则不会再给别的任务派送这个文件块,同时调度其他的replica来恢复。
每个datanode会定期地检查自己的数据。
使用本地的库来进行压缩或解压可以节省很多时间,相对于通过Java实现的来说。几乎所有的压缩方式都有本地的实现,而有的则没有Java的版本。
Apache Hadoop打包好的二进制的hadoop版本,包含了一个libhadoop.so的压缩包。这个版本只为64-bit Linux。其他的平台则要自己编译一个。默认的,Hadoop会寻找本地版本的库来使用,因此不需要去改变配置来使用本地的库。而有的时候你想要关闭本地的库,则需要将io.native.lib.available设置为false。
如果使用了很多的压缩和解压缩的话,可以使用CodecPool来复用压缩器和解压缩器。
压缩与输入切分
一个1GB的未压缩的文件存储在HDFS中,会被存储在8个block中,一个使用这个文件的MR任务会使用八个任务来处理这些输入。而如果是gzip压缩的话,无法从任意一个文件偏移开始读取gzip流,因此无法分成8个来分开处理。只能用一个map来串行地处理这个8个输入。MR会根据扩展名来判断,不用担心。这就牺牲了本地化。同时粒度也小了,就需要更长的时间去运行了。
具体什么的压缩格式比较合适,应该选用支持切分的。
通过设置mapreduce.output.fileoutputformat.compress
为true
,设置mapreduce.output.fileoutputformat.compress.codec
为需要使用的压缩codec。
因为map的输出结果需要很大的网络开销,所以可以使用一些能够快速压缩的格式,来压缩map的输出
序列化
序列化石把结构化的数据转换为一个字节流,这样可以在网络中传输,或者用于持久化存储。在分布式系统中主要用于进程间的通讯和持久化存储。
需要几个特点,一个是compact,这样可以充分利用带宽资源,另一个是快速,还有可扩展性,最后还有一个就是可内部操作。Hadoop使用了自己特有的序列化格式,只能在Java中使用,而Avro也是一个序列化的系统,用来克服专有格式带来的一些限制。